<?php


namespace app\api\service;

use app\lib\enum\OrderStatusEnum;
use think\Db;
use think\Exception;
use think\Loader;
use app\api\model\Order as orderModel;
use app\api\service\Order as orderService;
use think\Log;

Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php');


class WxNotify extends \WxPayNotify {

    //支付回调
    public function NotifyProcess($data, &$msg){
        /**
         * return_code : 是通信表示，表示此次支付通讯成功,不能通过此方式来判断支付
         * result_code : 是支付成功的表示
         * 返回的是xml格式
         *
         *
         */

//        <xml>
//           <appid>wx2421b1c4370ec43b</appid>
//           <attach>支付测试</attach>
//           <body>JSAPI支付测试</body>
//           <mch_id>10000100</mch_id>
//           <detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"苹果手机" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"苹果手机" } ] }]]></detail>
//           <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
//           <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
//           <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
//           <out_trade_no>1415659990</out_trade_no>
//           <spbill_create_ip>14.23.150.211</spbill_create_ip>
//           <total_fee>1</total_fee>
//           <trade_type>JSAPI</trade_type>
//           <sign>0CB01533B8C1EF103065174F50BCA001</sign>
//       </xml>

        if($data['return_code'] =='SUCCESS' && $data['result_code'] =='SUCCESS'){//支付成功
            //检验订单的数量
            $orderNo = $data['out_trade_no'];
            Db::startTrans();//开启事物，修改订单状态和修改数量同时成功才
            try{
                //获取订单信息
                $order = orderModel::where('order_no',$orderNo)->find();
//                $order = orderModel::where('order_no',$orderNo)->find()->lock(true);

                if($order->status == 1){
                    $service = new orderService();
                    $stockStatus = $service->checkOrderStock($order->id);//获取该订单中的所有商品是否都有库存
                    if($stockStatus['pass']){//通过库存量检测
                        //修改订单状态
                        $this->updateOrderStatus($order->id,true);
                        //修改库存量
                        $this->reduceStock($stockStatus);

                    }else{//没有通过库存量的检测，表示支付成功，但是没有货了，就只修改订单状态
                        $this->updateOrderStatus($order->id,false);
                    }
                }
                Db::commit();
                return true;
            }catch (Exception $e){
                Log::error($e);
                Db::rollback();
                return false;
            }
        }else{
            //不过支付成功或者是失败，微信都会发送异步回调通知给我，
            //如果支付失败了，微信返回的就是支付失败的消息，支付成功了，微信返回的是支付成功的消息
            //仅仅是个通知，要让微信知晓我们收到了通知了就可以了，所以不管是支付成功或者是失败，全部返回true
            return true;
        }
    }

    //修改订单状态
    private function updateOrderStatus($orderId,$success){
        $status = $success ? OrderStatusEnum::PAID : OrderStatusEnum::PAID_BUT_OUT_OF;
        orderModel::where('id',$orderId)->update(['status'=>$status]);
    }

    //减少库存
    private function reduceStock($stockStatus){

        /**
         * 1.通过回调数据中的 $orderNo,获取订单id 通过订单id去 获取订单商品表中的 商品id 购买该该商品的具体数量
         * 2.修改商品表中对应商品的数量
         *
         */

//        $sql = ' SELECT * FROM  order_product where order_id = '.$orderId;
//        $orderProduct = pdo_fetch($sql);
//        //减少数量
//        foreach ($orderProduct as $product){
//            //获取商品的库存
//              $sql = ' SELECT * FROM product where id = '.$product['product_id'];
//              $list = pdo_fetch($sql);
//              $stock = $list['stock'] - $product['count'];
//              $sql =' UPDATE product  SET stock = '.$stock .' WHERE id = '.$product['product_id'];
//              $res = pdo_update($sql);
//        }


        foreach ($stockStatus['pStatusArray'] as $singlePstatus){
            product::where('id','=',$singlePstatus['id'])->setDec('stock',$singlePstatus['count']);
        }
    }
}






















